library(tidyverse)

library(sf)
library(exactextractr)

library(patchwork)
library(ggtext)
library(units)

library(gt)


set.seed(123)

distrito <- read_sf("dados/distrito/SIRGAS_SHP_distrito.shp") %>% st_set_crs("epsg:31983")

Microdados do Censo de 2022

É importante destacar que os resultados disponíveis são parciais do censo, com dados atualizados até o momento da divulgação. No entanto, mesmo parciais, esses dados podem ser extremamente úteis para suas análises.

Um ponto crucial a considerar é que o nível mínimo de observação georreferenciada nos microdados do censo são os setores censitários. Os setores censitários são unidades geográficas definidas pelo Instituto Brasileiro de Geografia e Estatística (IBGE) para coleta e tabulação de dados censitários. Eles são delimitados de forma a garantir uma cobertura completa e homogênea de todo o território nacional, facilitando a análise comparativa entre diferentes áreas geográficas. A delimitação geográfica do setor também considera questões logísticas para o entrevistador conseguir entrevistar a todos.

# Read dados do censo 2022
censo <- read_sf("dados/censo/SP_Malha_Preliminar_2022.shp") %>% 
  filter(CD_MUN == "3550308") %>% 
  st_transform("epsg:31983") %>% # Sistema de coordenadas do geosampa
  select(id_setor_censitario = CD_SETOR, v0001:v0007) %>% 
  mutate(area_setor = st_area(geometry))
id_setor_censitario v0001 v0002 v0003 v0004 v0005 v0006 v0007 geometry area_setor
355030865000162P 387 175 175 0 2.464968 15.286624 157 MULTIPOLYGON (((317171.1 73… 16922.673 [m^2]
355030865000212P 0 0 0 0 0.000000 0.000000 0 MULTIPOLYGON (((315687 7390… 140800.066 [m^2]
355030894000058P 454 200 200 0 2.624277 13.872832 173 MULTIPOLYGON (((322916.4 73… 50586.575 [m^2]
355030887000240P 275 110 110 0 2.806122 0.000000 98 MULTIPOLYGON (((349650 7398… 17561.293 [m^2]
355030816000121P 504 199 199 0 2.815642 6.703911 179 MULTIPOLYGON (((327500.2 73… 8505.213 [m^2]
355030811000366P 354 141 141 0 2.702290 0.763359 131 MULTIPOLYGON (((326485.3 74… 20262.617 [m^2]
355030890000401P 364 154 152 2 2.704545 3.030303 132 MULTIPOLYGON (((333492.1 73… 38371.871 [m^2]
355030817000257P 573 223 223 0 2.715640 0.473934 211 MULTIPOLYGON (((319169.9 73… 25092.100 [m^2]
355030839000186P 419 189 189 0 2.554878 12.804878 164 MULTIPOLYGON (((338525.8 74… 34774.171 [m^2]
355030821000138P 497 289 289 0 2.142241 27.155172 232 MULTIPOLYGON (((331360 7399… 92594.456 [m^2]
gg <- ggplot() +
  geom_sf(data = censo %>%
            mutate(densidade = v0001/area_setor,
                   decil = ntile(densidade, 10)),
          aes(fill = factor(decil)), color = NA) +
  scale_fill_viridis_d() +
  labs(fill = "Decil de densidade") +
  theme_void()

ggsave("tex/imagens/mapa.png", gg, width = 20, height = 20, dpi = 400)

descritiva <- censo %>% 
  st_drop_geometry() %>% 
  summarize("Total de pessoas" = sum(v0001),
            "Total de Domicílios" = sum(v0002),
            "Total de Domicílios Particulares Ocupados" = sum(v0007)) %>% 
  pivot_longer(everything())
name value
Total de pessoas 11.451.999
Total de Domicílios 4.996.529
Total de Domicílios Particulares Ocupados 4.316.336
censo %>% 
  mutate(distancia_centro = st_distance(geometry, 
                                        read_sf("dados/distrito/SIRGAS_SHP_distrito.shp") %>% 
                                          st_set_crs("epsg:31983") %>% 
                                          filter(ds_nome == "SE")) %>% 
           as.numeric() %>% 
           cut(breaks = 10^3*(0:40), labels = FALSE)) %>% 
  st_drop_geometry() %>%
  group_by(distancia_centro) %>% 
  summarize(densidade = sum(v0001) / sum(as.numeric(area_setor) / 10^6)) %>% 
  ggplot(aes(x = distancia_centro, y = densidade)) +
  geom_col() +
  scale_y_continuous(labels = scales::comma_format(big.mark = ".")) +
  scale_x_continuous(labels = scales::comma_format(big.mark = ".")) +
  labs(x = "Distância ao centro em quilômetros", 
       y = "Densidade populacional por quilômetro quadrado") +
  theme_classic()

Base de Dados do IPTU

A base de dados do IPTU (Imposto Predial e Territorial Urbano) é uma fonte abrangente de informações sobre imóveis urbanos dentro do município. Essa base é considerada completa, pois abrange todos os imóveis sujeitos à tributação do IPTU, representando uma fonte confiável e abrangente de informações sobre a propriedade urbana. Propriedades que não foram construídas dentro da legalidade não constam nessa base.

O número do contribuinte, utilizado para identificar exclusivamente cada imóvel na base de dados do IPTU, é representado diretamente pelo SQL, sendo essencial para consultas e manipulação dos dados relacionados ao imposto predial e territorial urbano. Esse formato permite a integração e cruzamento com outras bases de dados, como a base de lotes, que está georreferenciada, fornecendo informações espaciais adicionais que não estão disponíveis na base do IPTU.

Procedimento para Lotes de Condomínios

Quando um lote é um condomínio, ou seja, quando não se classifica de acordo com condominio == "00-0", é necessário substituir os múltiplos números de SQL pelo número do condomínio. Isso ocorre porque cada unidade dentro do condomínio pode ser tratada como uma entidade separada para fins tributários, mas para a base de lotes, estão todos juntos.

IPTU <- read.csv("dados/IPTU/IPTU_2024.csv", sep=";", encoding = "latin1") %>% 
    as_tibble() %>% 
    select(sql = "NUMERO.DO.CONTRIBUINTE", 
           condominio = "NUMERO.DO.CONDOMINIO",
           area_terreno = "AREA.DO.TERRENO",
           area_construida = "AREA.CONSTRUIDA",
           area_ocupada = "AREA.OCUPADA",
           pavimentos = "QUANTIDADE.DE.PAVIMENTOS",
           ano_construcao = "ANO.DA.CONSTRUCAO.CORRIGIDO",
           tipo = "TIPO.DE.PADRAO.DA.CONSTRUCAO") %>% 
    
    # Separação do número de contribuinte (SQL) em setor quadra e lote
    mutate(setor =  str_sub(sql, 1, 3),
           quadra = str_sub(sql, 4, 6),
           
           # Quando o lote é um condomínio, haverá vários SQLs no mesmo lote. CD = Condomínio
           lote = str_sub(sql, 7, 10) %>% 
             ifelse(condominio == "00-0", ., paste("CD", str_sub(condominio, 1, 2), sep = "")),
           
           # Tipo de uso
           residencial = str_detect(tipo, "Residencial"),
           
           # Medida de verticalização
           verticalizacao = pavimentos * area_ocupada / area_terreno)
sql condominio area_terreno area_construida area_ocupada pavimentos ano_construcao tipo setor quadra lote residencial verticalizacao
0791950076-1 01-9 1141 172 700 3 2005 Residencial horizontal - padrão C 079 195 CD01 TRUE 1.8404908
0863750072-2 01-9 8717 278 6009 29 2007 Residencial vertical - padrão D 086 375 CD01 TRUE 19.9909372
0210180067-5 02-7 2500 377 1859 23 2015 Residencial vertical - padrão E 021 018 CD02 TRUE 17.1028000
0151330376-7 07-8 1606 52 1268 21 2019 Residencial vertical - padrão C 015 133 CD07 TRUE 16.5803238
0260650036-9 00-0 165 50 50 1 1919 Comercial horizontal - padrão B 026 065 0036 FALSE 0.3030303
0570180175-6 02-7 2360 110 1813 28 2020 Residencial vertical - padrão C 057 018 CD02 TRUE 21.5101695
0412080395-3 03-5 2294 24 1888 18 1996 Residencial vertical - padrão C 041 208 CD03 TRUE 14.8142982
1470530112-8 00-0 125 228 100 2 2001 Residencial horizontal - padrão C 147 053 0112 TRUE 1.6000000

Tipos de uso para IPTU

Todos os empreendimentos não públicos regulares (de acordo com a lei) constam nesta base de dados. A seguir está uma análise de quais são estes tipos. O tipo de interesse para esta análise é apenas os residenciais.

gg.right <- IPTU %>% 
  mutate(uso = case_when(str_detect(tipo, "Residencial") ~ "Residencial",
                         str_detect(tipo, "Comercial") ~ "Comercial",
                         str_detect(tipo, "Oficina") ~ "Industria",
                         str_detect(tipo, "TERRENO") ~ "Terreno",
                         str_detect(tipo, "Clube") ~ "Entretenimento",
                         .default = "Outros") %>% as.factor(),
         padrao = case_when(str_detect(tipo, "A$") ~ "A",
                            str_detect(tipo, "B$") ~ "B",
                            str_detect(tipo, "C$") ~ "C",
                            str_detect(tipo, "D$") ~ "D",
                            str_detect(tipo, "E$") ~ "E",
                            .default = "NA"),
         nome = paste("(", padrao, ") ", uso, sep = "")) %>% 
  group_by(uso, padrao, nome) %>% 
  summarize(area = sum(area_construida)) %>% 
  ungroup() %>% 
  mutate(percentual = area * 100/ sum(area, na.rm = TRUE),
         texto = case_when(percentual < 1 ~ "<1%",
                           percentual < 5 ~ paste(round(percentual,1), "%", sep = ""),
                           .default = paste(round(percentual, 2), "%", sep = "")),
         color = ifelse(uso == "Outros", "white", "black")) %>% 
  ggplot() +
  treemapify::geom_treemap(aes(fill = uso, area = area), size = 2, color = NA) +
  treemapify::geom_treemap(aes(alpha = padrao, area = area), fill = "black", color = NA) +
  treemapify::geom_treemap_text(aes(area = area, label = nome, color = color), alpha = .4, grow = FALSE, size = 8) +
  treemapify::geom_treemap_text(aes(area = area, label = texto, color = color), 
                                alpha = .4, place = "middle", size = 10) +
  scale_fill_manual(values = c("Residencial" = "#FAE48B", 
                               "Comercial" = "#A6EEE6",
                               "Industria" = "#84BD00",
                               "Entretenimento" = "#FB6467",
                               "Outros" = "#1A5354")) +
  scale_alpha_manual(values = c("A" = 0, "B" = .05, "C" = .1, "D" = .15, "E" = .2, "NA" = 0)) +
  scale_color_manual(values = c("black" = "black", "white" = "white")) +
  labs(fill = "Tipo de uso", alpha = "Parão de uso") +
  theme(aspect.ratio=1)

gg.left <- IPTU %>% 
  mutate(uso = case_when(str_detect(tipo, "Residencial") ~ "Residencial",
                         str_detect(tipo, "Comercial") ~ "Comercial",
                         str_detect(tipo, "Oficina") ~ "Industria",
                         str_detect(tipo, "TERRENO") ~ "Terreno",
                         str_detect(tipo, "Clube") ~ "Entretenimento",
                         .default = "Outros") %>% as.factor()) %>% 
  group_by(uso) %>% 
  summarize(area = sum(area_construida, na.rm = TRUE)) %>% 
  ungroup() %>% 
  arrange(desc(uso)) %>% 
  mutate(percentual = area * 100 / sum(area, na.rm = TRUE),
         texto = ifelse(percentual > 5, paste(round(percentual, 1), "%", sep = ""), ""),
         ytext = (cumsum(area) + lag(cumsum(area)))/ 2) %>% 
  ggplot() +
  geom_col(aes(y = area, fill = uso, x = "")) +
  geom_text(aes(y = ytext, fill = uso, x = "", label = texto), alpha = .5) +
  scale_fill_manual(values = c("Residencial" = "#FAE48B", 
                               "Comercial" = "#A6EEE6",
                               "Industria" = "#84BD00",
                               "Entretenimento" = "#FB6467",
                               "Outros" = "#1A5354")) +
  theme_void() +
  theme(legend.position = "none")

ggsave("tex/imagens/tree_area_construida.png", 
       (gg.left | gg.right) + 
         plot_layout(widths = c(1,6)), 
       width = 10, height = 8, dpi = 250)

Agrupamento dos condomínios

Quando há um condomínio com múltiplos contribuintes de IPTU, ele deve ser agregado a nível lote, para que possa ser cruzado com a base de lotes, possibilitando que seja georreferenciada. Todos os contribuintes dentro de um condomínio compartilham das mesmas características de área de terreno, área ocupada, ano de construção e pavimentos, então a mediana funciona para agregar estes dados, mas o máximo, mínimo, média ou pegar o primeiro valor também funcionaria.

IPTU <- IPTU %>% 
  # Agregar por SQL
  group_by(setor, quadra, lote) %>% 
  summarize(unidades = n(),
            area_terreno = median(area_terreno), 
            area_construida = sum(area_construida), 
            area_ocupada = median(area_ocupada),
            pavimentos = median(pavimentos),
            ano_construcao = median(ano_construcao),
            residencial = median(residencial),
            verticalizacao = median(verticalizacao)) %>% 
  ungroup()
setor quadra lote unidades area_terreno area_construida area_ocupada pavimentos ano_construcao residencial verticalizacao
167 043 0044 1 290 106 106 1 1967 1 0.3655172
120 409 0044 1 125 30 30 1 1970 1 0.2400000
089 210 0017 1 138 83 83 1 1970 1 0.6014493
067 381 0053 1 160 96 96 1 1970 1 0.6000000
081 254 0024 1 501 513 240 2 1986 1 0.9580838
067 349 0017 1 140 0 0 0 0 0 0.0000000
066 323 0061 1 180 109 79 2 1982 1 0.8777778
029 022 0043 1 104 180 60 3 1954 1 1.7307692
IPTU %>% 
  mutate(unitario = unidades == 1) %>% 
  group_by(unitario) %>% 
  summarize(n = n(),
            soma = sum(unidades))
## # A tibble: 2 × 3
##   unitario       n    soma
##   <lgl>      <int>   <int>
## 1 FALSE      33129 1782366
## 2 TRUE     1314353 1314353
gg <- IPTU %>% 
  ungroup() %>% 
  mutate(CA = area_construida / area_terreno,
         cota_parte = area_terreno / unidades) %>% 
  filter(cota_parte < 600, CA < 5, verticalizacao < 5) %>% 
  select("Cota Parte" = cota_parte, "Coeficiente de Aproveitamento (CA)" = CA, "Verticalização" = verticalizacao) %>% 
  pivot_longer(everything()) %>% 
  ggplot() +
  geom_histogram(aes(x = value)) +
  facet_wrap(~ name, scales = "free_x") +
  labs(title = "Distribuição dos indicadores em SP", x = "", y = "Frequência") + 
  theme_classic()

ggsave("tex/imagens/indicadores.png", gg, width = 9, height = 4, dpi = 250)

Geosampa

GeoSampa é o portal de mapas e dados geoespaciais da cidade de São Paulo, mantido pela prefeitura. Ele fornece uma vasta gama de informações geográficas, incluindo mapas, dados demográficos, infraestruturas e muito mais. Este portal é uma ferramenta valiosa para pesquisadores, urbanistas e qualquer pessoa interessada em informações espaciais detalhadas sobre a cidade.

https://geosampa.prefeitura.sp.gov.br/

Lotes

Base de Lotes: No GeoSampa, a base de lotes representa a divisão da cidade em pequenos segmentos, geralmente correspondentes a terrenos individuais ou condomínios. Esta base está organizada de forma que cada bairro tem seu próprio conjunto de dados e os dados de lotes para cada bairro podem ser baixados diretamente do site do GeoSampa em formato zip, contendo arquivos como .shp (shapefile), .dbf (database file), e .shx (index file).

# Extração do zip file com lotes de cada bairro
if (!"zip" %in% list.files(path = "dados/lotes")){
  for (file in list.files(path="dados/lotes/zip", full.names = FALSE) %>% 
       str_remove("\\.zip")){
    unzip(paste("dados/lotes/zip/", file, ".zip", sep = ""), 
          paste(file, "/", file, ".shp", sep = ""), 
          exdir = "dados/lotes/unzip")
    unzip(paste("dados/lotes/zip/", file, ".zip", sep = ""), 
          paste(file, "/", file, ".dbf", sep = ""), 
          exdir = "dados/lotes/unzip")
    unzip(paste("dados/lotes/zip/", file, ".zip", sep = ""), 
          paste(file, "/", file, ".shx", sep = ""), 
          exdir = "dados/lotes/unzip")
  }
}
# Junção dos shapes dos lotes de cada bairro em uma tabela
lotes <- list.files(path="dados/lotes/unzip", full.names = FALSE) %>% 
    paste("dados/lotes/unzip/", ., "/", ., ".shp", sep = "") %>% 
    lapply(read_sf) %>% 
    bind_rows %>% 
    st_set_crs("epsg:31983") 
lo_setor lo_quadra lo_lote lo_condomi lo_tp_quad lo_tp_lote geometry
167 132 0045 00 F F POLYGON ((318784.2 7380149,…
190 080 0074 00 F F POLYGON ((325062.6 7407082,…
094 216 0004 00 F F POLYGON ((322911.5 7380401,…
116 439 0047 00 F F POLYGON ((344826.2 7393609,…
163 140 0022 00 F F POLYGON ((327461.5 7375627,…
123 137 0004 00 F F POLYGON ((325149.4 7389246,…
017 042 0030 00 F F POLYGON ((335012.9 7397163,…
113 367 0030 00 F F POLYGON ((347760 7397382, 3…

Tipos de lotes

Os lotes podem ser classificados de três formas

  • Lotes fiscais: apresentam contribuintes do IPTU
  • Espaço livre: espaços públicos
  • Via de acesso: Ruas fechadas para acesso dentro de uma quadra

Os lotes fiscais podem ser unidades ou condomínios. Um prédio, por exemplo, fica em um único lote, mas dentro pode haver diversas unidades, então se configura como um condomínio. Não é possível saber através dos dados de lotes quantas unidades estão no condomínio, nem alguma forma de discriminá-los.

lotes %>% 
  mutate(condominio = case_when(lo_condomi == "00" ~ "Unidade",
                                lo_condomi != "00" ~ "Condomínio"),
         tipo = case_when(lo_tp_lote == "F" ~ "Fiscal",
                          lo_tp_lote == "M" ~ "Espaço livre",
                          lo_tp_lote == "V" ~ "Via de acesso",
                          .default = NA),
         area = st_area(geometry) %>% as.numeric()) %>% 
  st_drop_geometry() %>% 
  ggplot() +
  geom_violin(aes(x = factor(condominio), y = area, fill = tipo)) +
  scale_y_log10(labels = scales::comma_format(big.mark = ".")) +
  labs(title = "Área dos lotes em SP" , x = "", y = "Área em metros quadrados", fill = "Tipo de lote") +
  theme_classic()

SQL dos Lotes (Setor, Quadra e Lote)

Na base de dados de lotes, cada lote é identificado por três componentes principais:

  1. Setor (lo_setor): Uma divisão maior dentro do município que agrupa várias quadras.
  2. Quadra (lo_quadra): Uma subdivisão dentro de um setor que agrupa vários lotes.
  3. Lote (lo_lote): A menor unidade de divisão, que representa um terreno ou uma parcela específica dentro de uma quadra. Essa estrutura de Setor-Quadra-Lote é crucial para identificar de forma única cada lote dentro do município. No código, esses identificadores são utilizados para manipular e cruzar os dados de lotes com outras bases de dados, como a base de IPTU.
lotes <- lotes %>% 
 filter(lo_tp_lote == "F") %>% # Seleção apenas de lotes fiscais
  mutate(lo_lote = ifelse(lo_lote == "0000", paste("CD", lo_condomi, sep = ""), lo_lote)) %>% 
  select(setor = lo_setor, quadra = lo_quadra, lote = lo_lote)
setor quadra lote geometry
199 026 0078 POLYGON ((321255.7 7398828,…
067 133 0019 POLYGON ((336456.7 7403303,…
131 122 0070 POLYGON ((349095.4 7401639,…
187 231 0011 POLYGON ((320942.7 7411028,…
132 166 0011 POLYGON ((355539.3 7400664,…
160 051 0001 POLYGON ((320340.4 7392416,…
184 219 0019 POLYGON ((318122.4 7383346,…
167 212 0005 POLYGON ((318621.2 7381292,…

Base de quadras

quadras <- read_sf("dados/quadras/SIRGAS_SHP_quadraMDSF.shp") %>% 
  st_set_crs("epsg:31983") %>% 
  filter(qd_tipo == "F") %>% # Apenas quadras fiscais
  select(setor = qd_setor, quadra = qd_fiscal) %>% 
  group_by(setor, quadra) %>% 
  summarize(geometry = st_union(geometry)) %>% 
  ungroup()

Base de setores

setores <- read_sf("dados/setor/SIRGAS_SHP_setorfiscal.shp") %>% 
  st_set_crs("epsg:31983") %>% 
  select(setor = st_codigo) %>% 
  group_by(setor) %>% 
  summarize(geometry = st_union(geometry)) %>% 
  ungroup()

Join entre a Base de Lotes e a Base do IPTU

# Join dos lotes com IPTU com base no SQL
IPTU.lote <- IPTU %>% 
  filter(residencial == 1) %>% 
  left_join(lotes, by = join_by(setor, quadra, lote)) %>% 
  ungroup()
setor quadra lote unidades area_terreno area_construida area_ocupada pavimentos ano_construcao residencial verticalizacao geometry
049 048 0028 1 324 230 230 1 1970 1 0.7098765 POLYGON ((336888.9 7386628,…
153 217 0008 1 76 90 59 2 2004 1 1.5526316 POLYGON ((348408.9 7387197,…
122 151 0055 1 291 178 178 1 1982 1 0.6116838 POLYGON ((322291.4 7383165,…
051 056 0013 1 368 223 111 2 1960 1 0.6032609 POLYGON ((339675.3 7389090,…
077 056 0004 1 450 181 112 2 1967 1 0.4977778 POLYGON ((325203.8 7401163,…
091 448 0026 1 154 112 87 2 1975 1 1.1298701 POLYGON ((331518.3 7382858,…
111 308 0003 1 320 30 30 1 1967 1 0.0937500 POLYGON ((348173.8 7399954,…
111 170 0010 1 290 56 56 1 1970 1 0.1931034 POLYGON ((349192.9 7399454,…
IPTU.quadra <- IPTU %>% 
  filter(residencial == 1) %>% 
  group_by(setor, quadra) %>% 
  summarize(unidades = sum(unidades),
            area_construida = sum(area_construida),
            verticalizacao = weighted.mean(verticalizacao, area_terreno),
            area_terreno = sum(area_terreno)) %>% 
  left_join(quadras, by = join_by(setor, quadra)) %>% 
  ungroup()
IPTU.setor <- IPTU %>% 
  filter(residencial == 1) %>% 
  group_by(setor) %>% 
  summarize(unidades = sum(unidades),
            area_construida = sum(area_construida),
            verticalizacao = weighted.mean(verticalizacao, area_terreno),
            area_terreno = sum(area_terreno)) %>% 
  left_join(setores, by = join_by(setor)) %>% 
  ungroup()
list(IPTU %>% filter(residencial == 1) %>% mutate(base = "bruta"), 
     IPTU.setor  %>% mutate(base = "Setor")  %>% filter(!geometry %>% st_is_empty()), 
     IPTU.quadra %>% mutate(base = "Quadra") %>% filter(!geometry %>% st_is_empty()), 
     IPTU.lote   %>% mutate(base = "Lote")   %>% filter(!geometry %>% st_is_empty())) %>% 
  lapply(function(x) x %>% 
           group_by(base) %>% 
           summarize(unidades = sum(unidades))) %>% 
  bind_rows %>% 
  pivot_wider(names_from = base, values_from = unidades) %>% 
  pivot_longer(2:4) %>% 
  mutate(missing = bruta - value,
         missing_percent = (100 *missing / bruta) %>% round(2) %>% paste("%")) %>% 
  select("Critério de join" = name,
         "Erros (unidades)" = missing,
         "Percentual de erro" = missing_percent)
## # A tibble: 3 × 3
##   `Critério de join` `Erros (unidades)` `Percentual de erro`
##   <chr>                           <int> <chr>               
## 1 Setor                               0 0 %                 
## 2 Quadra                            820 0.03 %              
## 3 Lote                            44319 1.67 %

Algumas estatísticas descritivas

gg <- IPTU.lote %>% 
  mutate(distancia_centro = st_distance(geometry, 
                                        read_sf("dados/distrito/SIRGAS_SHP_distrito.shp") %>% 
                                          st_set_crs("epsg:31983") %>% 
                                          filter(ds_nome == "SE")) %>% 
           as.numeric() %>% 
           cut(breaks = 10^3*(0:40), labels = FALSE)) %>% 
  st_drop_geometry() %>% 
  group_by(distancia_centro) %>% 
  summarize(verticalizacao = weighted.mean(verticalizacao, area_terreno)) %>% 
  ggplot(aes(x = distancia_centro, y = verticalizacao)) +
  geom_col() +
  geom_hline(yintercept = 1, linetype = "dotted") +
  labs(x = "Distância ao centro em quilômetros", 
       y = "Verticalização") + 
  scale_y_continuous(breaks = (1:6)) +
  theme_classic()

ggsave("tex/imagens/verticalizacao.png", gg, width = 6, height = 4, dpi = 250)

gg.lotes <- IPTU.quadra %>% 
  ggplot() +
  geom_sf(data = distrito, fill = "black") +
  geom_sf(aes(fill = verticalizacao, geometry = geometry), color = NA) +
  theme_void() +
  scale_fill_gradient(low = "#004D40FF", high = "#E0F2F1FF")

gg.setor <- IPTU.setor %>% 
  ggplot() +
  geom_sf(data = distrito, fill = "black") +
  geom_sf(aes(fill = verticalizacao, geometry = geometry), color = NA) +
  theme_void() +
  scale_fill_gradient(low = "#004D40FF", high = "#E0F2F1FF")

ggsave("tex/imagens/mapa_verticalizacao.png", 
       (gg.lotes | gg.setor), width = 20, height = 20, dpi = 300)

geoms <- IPTU.setor %>% 
  filter(! st_is_empty(geometry)) %>% 
  st_as_sf() %>% 
  mutate(area = st_area(geometry) %>% as.numeric()) %>% 
  select(id = setor, unidades, area)

bbox <- st_bbox(geoms)

ras <- raster::raster(xmn = bbox["xmin"], xmx = bbox["xmax"], ymn = bbox["ymin"], ymx = bbox["ymax"], 
            res = 2000, crs = "epsg:31983")

IPTU.setor %>% summarize(sumaa = sum(unidades))
## # A tibble: 1 × 1
##     sumaa
##     <int>
## 1 2659074
IPTU %>% filter(residencial == 1) %>% summarize(somaa = sum(unidades))
## # A tibble: 1 × 1
##     somaa
##     <int>
## 1 2659074
result <- exact_extract(ras, geoms, include_xy = T, 
                        include_cols = c("id", "unidades", "area"), 
                        force_df = T, coverage_area = T) %>% 
  bind_rows %>% 
  mutate(percent_intersect = coverage_area / area,
         unidades_ponderadas = unidades * percent_intersect) %>% 
  group_by(x, y) %>% 
  summarize(unidades = sum(unidades_ponderadas)) %>% 
  ungroup()
## 
  |                                                                            
  |                                                                      |   0%
  |                                                                            
  |                                                                      |   1%
  |                                                                            
  |=                                                                     |   1%
  |                                                                            
  |=                                                                     |   2%
  |                                                                            
  |==                                                                    |   2%
  |                                                                            
  |==                                                                    |   3%
  |                                                                            
  |==                                                                    |   4%
  |                                                                            
  |===                                                                   |   4%
  |                                                                            
  |===                                                                   |   5%
  |                                                                            
  |====                                                                  |   5%
  |                                                                            
  |====                                                                  |   6%
  |                                                                            
  |=====                                                                 |   7%
  |                                                                            
  |=====                                                                 |   8%
  |                                                                            
  |======                                                                |   8%
  |                                                                            
  |======                                                                |   9%
  |                                                                            
  |=======                                                               |  10%
  |                                                                            
  |========                                                              |  11%
  |                                                                            
  |========                                                              |  12%
  |                                                                            
  |=========                                                             |  12%
  |                                                                            
  |=========                                                             |  13%
  |                                                                            
  |==========                                                            |  14%
  |                                                                            
  |==========                                                            |  15%
  |                                                                            
  |===========                                                           |  15%
  |                                                                            
  |===========                                                           |  16%
  |                                                                            
  |============                                                          |  17%
  |                                                                            
  |============                                                          |  18%
  |                                                                            
  |=============                                                         |  18%
  |                                                                            
  |=============                                                         |  19%
  |                                                                            
  |==============                                                        |  20%
  |                                                                            
  |===============                                                       |  21%
  |                                                                            
  |===============                                                       |  22%
  |                                                                            
  |================                                                      |  23%
  |                                                                            
  |=================                                                     |  24%
  |                                                                            
  |==================                                                    |  25%
  |                                                                            
  |==================                                                    |  26%
  |                                                                            
  |===================                                                   |  27%
  |                                                                            
  |====================                                                  |  28%
  |                                                                            
  |====================                                                  |  29%
  |                                                                            
  |=====================                                                 |  30%
  |                                                                            
  |======================                                                |  31%
  |                                                                            
  |======================                                                |  32%
  |                                                                            
  |=======================                                               |  33%
  |                                                                            
  |========================                                              |  34%
  |                                                                            
  |========================                                              |  35%
  |                                                                            
  |=========================                                             |  35%
  |                                                                            
  |=========================                                             |  36%
  |                                                                            
  |==========================                                            |  37%
  |                                                                            
  |==========================                                            |  38%
  |                                                                            
  |===========================                                           |  38%
  |                                                                            
  |===========================                                           |  39%
  |                                                                            
  |============================                                          |  39%
  |                                                                            
  |============================                                          |  40%
  |                                                                            
  |=============================                                         |  41%
  |                                                                            
  |=============================                                         |  42%
  |                                                                            
  |==============================                                        |  42%
  |                                                                            
  |==============================                                        |  43%
  |                                                                            
  |===============================                                       |  44%
  |                                                                            
  |===============================                                       |  45%
  |                                                                            
  |================================                                      |  45%
  |                                                                            
  |================================                                      |  46%
  |                                                                            
  |=================================                                     |  47%
  |                                                                            
  |=================================                                     |  48%
  |                                                                            
  |==================================                                    |  48%
  |                                                                            
  |==================================                                    |  49%
  |                                                                            
  |===================================                                   |  49%
  |                                                                            
  |===================================                                   |  50%
  |                                                                            
  |===================================                                   |  51%
  |                                                                            
  |====================================                                  |  51%
  |                                                                            
  |====================================                                  |  52%
  |                                                                            
  |=====================================                                 |  52%
  |                                                                            
  |=====================================                                 |  53%
  |                                                                            
  |======================================                                |  54%
  |                                                                            
  |======================================                                |  55%
  |                                                                            
  |=======================================                               |  55%
  |                                                                            
  |=======================================                               |  56%
  |                                                                            
  |========================================                              |  57%
  |                                                                            
  |========================================                              |  58%
  |                                                                            
  |=========================================                             |  58%
  |                                                                            
  |=========================================                             |  59%
  |                                                                            
  |==========================================                            |  60%
  |                                                                            
  |==========================================                            |  61%
  |                                                                            
  |===========================================                           |  61%
  |                                                                            
  |===========================================                           |  62%
  |                                                                            
  |============================================                          |  62%
  |                                                                            
  |============================================                          |  63%
  |                                                                            
  |=============================================                         |  64%
  |                                                                            
  |=============================================                         |  65%
  |                                                                            
  |==============================================                        |  65%
  |                                                                            
  |==============================================                        |  66%
  |                                                                            
  |===============================================                       |  67%
  |                                                                            
  |================================================                      |  68%
  |                                                                            
  |================================================                      |  69%
  |                                                                            
  |=================================================                     |  70%
  |                                                                            
  |==================================================                    |  71%
  |                                                                            
  |==================================================                    |  72%
  |                                                                            
  |===================================================                   |  73%
  |                                                                            
  |====================================================                  |  74%
  |                                                                            
  |====================================================                  |  75%
  |                                                                            
  |=====================================================                 |  76%
  |                                                                            
  |======================================================                |  77%
  |                                                                            
  |=======================================================               |  78%
  |                                                                            
  |=======================================================               |  79%
  |                                                                            
  |========================================================              |  80%
  |                                                                            
  |=========================================================             |  81%
  |                                                                            
  |=========================================================             |  82%
  |                                                                            
  |==========================================================            |  82%
  |                                                                            
  |==========================================================            |  83%
  |                                                                            
  |===========================================================           |  84%
  |                                                                            
  |===========================================================           |  85%
  |                                                                            
  |============================================================          |  85%
  |                                                                            
  |============================================================          |  86%
  |                                                                            
  |=============================================================         |  87%
  |                                                                            
  |=============================================================         |  88%
  |                                                                            
  |==============================================================        |  88%
  |                                                                            
  |==============================================================        |  89%
  |                                                                            
  |===============================================================       |  90%
  |                                                                            
  |================================================================      |  91%
  |                                                                            
  |================================================================      |  92%
  |                                                                            
  |=================================================================     |  92%
  |                                                                            
  |=================================================================     |  93%
  |                                                                            
  |==================================================================    |  94%
  |                                                                            
  |==================================================================    |  95%
  |                                                                            
  |===================================================================   |  95%
  |                                                                            
  |===================================================================   |  96%
  |                                                                            
  |====================================================================  |  96%
  |                                                                            
  |====================================================================  |  97%
  |                                                                            
  |====================================================================  |  98%
  |                                                                            
  |===================================================================== |  98%
  |                                                                            
  |===================================================================== |  99%
  |                                                                            
  |======================================================================|  99%
  |                                                                            
  |======================================================================| 100%
r <- raster::rasterize(x = result %>% select(x, y), y = ras, field = result %>% pull(unidades))
r
## class      : RasterLayer 
## dimensions : 16, 22, 352  (nrow, ncol, ncell)
## resolution : 2000, 2000  (x, y)
## extent     : 316815, 360815, 7374882, 7406882  (xmin, xmax, ymin, ymax)
## crs        : +proj=utm +zone=23 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs 
## source     : memory
## names      : layer 
## values     : 1.002091, 72383.52  (min, max)
raster::plot(r)

Cruzamento entre a Base do Censo e a Base do IPTU

O processo de cruzamento foi realizado com base na intersecção das geometrias dos setores censitários e dos lotes do IPTU. Cada setor censitário e cada lote do IPTU possui uma geometria associada, representando sua área geográfica no mapa. Ao cruzar essas geometrias, é possível identificar quais lotes estão contidos em cada setor censitário e vice-versa.

É importante destacar que, em casos onde um lote foi dividido entre dois ou mais setores censitários, ocorrerá uma intersecção em ambas as áreas. Para lidar com essa situação, foi calculado o percentual da área do lote que está contida em cada setor censitário.

# Join dados do IPTU com do Censo através da intersecção das geometrias
IPTU.censo <- censo %>% 
  st_intersection(IPTU.lote %>% st_as_sf()) %>% 
  as_tibble() %>% 
  rename(geometria_intersec = geometry) %>% 
  
  # Retomada das geometrias do setor e lotes
  left_join(censo %>% 
              as_tibble() %>% 
              select(id_setor_censitario, 
                     geometria_setor_censitario = geometry),
            by = join_by(id_setor_censitario)) %>% 
  left_join(IPTU.lote %>% 
              as_tibble() %>% 
              select(setor, quadra, lote, 
                     geometria_lote = geometry),
            by = join_by(setor, quadra, lote)) %>% 
  
  # Cálculo de quanto % do lote está dentro do setor
  mutate(percent_intersec = as.numeric(st_area(geometria_intersec) / st_area(geometria_lote))) 
id_setor_censitario v0001 v0002 v0003 v0004 v0005 v0006 v0007 area_setor setor quadra lote unidades area_terreno area_construida area_ocupada pavimentos ano_construcao residencial verticalizacao geometria_intersec geometria_setor_censitario geometria_lote percent_intersec
355030893000182P 650 313 313 0 2.407407 3.703704 270 66545.90 [m^2] 044 092 0018 1 360 600 300 2 2019 1 1.6666667 POLYGON ((338893.1 7390604,… MULTIPOLYGON (((338978 7390… POLYGON ((338891.5 7390590,… 1.0000000
355030896000048P 765 271 270 1 3.031873 5.179283 251 47687.19 [m^2] 115 343 0024 1 115 200 100 2 1991 1 1.7391304 POLYGON ((356750.5 7396784,… MULTIPOLYGON (((356861.6 73… POLYGON ((356749.5 7396782,… 1.0000000
355030828000066P 728 323 323 0 2.545455 8.391608 286 34056.15 [m^2] 130 286 0014 1 299 400 210 2 1991 1 1.4046823 POLYGON ((347710 7401170, 3… MULTIPOLYGON (((347803.1 74… POLYGON ((347713.2 7401171,… 1.0000000
355030871000023P 384 164 164 0 2.844444 28.888889 135 106275.40 [m^2] 088 265 0351 1 401 410 205 1 1986 1 0.5112219 POLYGON ((327758.4 7384904,… MULTIPOLYGON (((327900 7385… POLYGON ((327754 7384919, 3… 1.0000000
355030896000071P 608 234 234 0 2.881517 6.161137 211 26319.25 [m^2] 138 176 0026 1 125 119 88 2 2001 1 1.4080000 POLYGON ((355278.8 7397050,… MULTIPOLYGON (((355288.8 73… POLYGON ((355277.1 7397045,… 1.0000000
355030868000149P 748 303 303 0 2.888031 9.266409 259 25093.66 [m^2] 157 020 0035 1 140 143 79 2 1982 1 1.1285714 POLYGON ((335749.3 7384182,… MULTIPOLYGON (((335769.3 73… POLYGON ((335757.4 7384187,… 1.0000000
355030864000080P 548 212 212 0 2.795918 7.142857 196 30000.23 [m^2] 111 151 0002 1 220 75 50 2 1985 1 0.4545455 POLYGON ((348713.8 7398937,… MULTIPOLYGON (((348791.1 73… POLYGON ((348735.6 7398930,… 1.0000000
355030886000085P 581 271 271 0 2.702326 6.976744 215 82078.28 [m^2] 068 555 0017 1 301 90 90 1 1970 1 0.2990033 POLYGON ((335447 7400688, 3… MULTIPOLYGON (((335682.5 74… POLYGON ((335448.7 7400679,… 1.0000000
355030821000028P 586 312 312 0 2.700461 8.294931 217 54365.98 [m^2] 075 258 0044 1 252 332 95 3 2002 1 1.1309524 POLYGON ((331400.4 7400874,… MULTIPOLYGON (((331685.8 74… POLYGON ((331398.2 7400876,… 1.0000000
355030829000026P 266 115 115 0 2.891304 32.608696 92 21554.58 [m^2] 104 077 0026 1 300 80 80 1 1988 1 0.2666667 POLYGON ((326127.3 7400794,… MULTIPOLYGON (((326131.9 74… POLYGON ((326129.8 7400790,… 0.9884079

Erros no join

Disparidades de informações

Teoricamente o número de domicílios deveria ser próximo do número de unidades habitacionais enunciadas pelo IPTU. Caso haja mais unidades habitacionais do que domicílios, houve algum equívoco na medição do censo, visto que entre domicílios não contam apenas os ocupados. Caso haja mais domicílios, há unidades que não são contribuintes do IPTU. O que é preocupante é que casos em que o número é diferente não são exceções.

gg <- censo %>% 
  st_drop_geometry() %>% 
  select(id_setor_censitario, domicilios = v0002) %>% 
  left_join(IPTU.censo %>% 
              st_drop_geometry() %>% 
              filter(residencial == 1) %>% 
              group_by(id_setor_censitario) %>% 
              summarize(unidades = sum(unidades))) %>% 
  mutate(unidades = replace_na(unidades, 0)) %>% 
  mutate(balanco = unidades / (unidades + domicilios)) %>% 
  ggplot() +
  geom_histogram(aes(x = balanco)) +
  labs(caption = "Caso o balanço seja 50%, implica que o número de domicílios reportados no censo é igual ao número de 
unidades reportadas no IPTU. Caso o balanço seja menor que 50%, implica que há mais domicílios no censo 
do que unidades, e caso seja maior que 50%, há mais unidades que domicílios",
title = "Disparidade entre censo e IPTU quanto ao número de unidades habitacionais",
    
       x = "Balanço: unidades / (unidades + domicilios)", y = "") +
  theme_classic() +
    theme(plot.caption = element_text(hjust = 0)) +
  scale_x_continuous(labels = scales::percent)


ggsave("tex/imagens/disparidade_censoIPTU.png", gg, width = 8, height = 5, dpi = 400)

Perfil geográfico dos erros

Alguns setores censitários não encontram pares na base de lotes. Isso acontece principalmente por conta de loteamentos irregulares e favelas, que não são contribuintes do IPTU, e, portanto, não constam na base. Isso não prejudica a análise, pois estes loteamentos não dependem da regulamentação urbana, então mudanças nos instrumentos e indicadores não impactariam essas regiões.

Outras falhas decorrem do erro do join da base do IPTU com lotes, como apontado anteriormente, mas estes casos são negligenciáveis.

distrito <- read_sf("dados/distrito/SIRGAS_SHP_distrito.shp") %>% st_set_crs("epsg:31983")
lotes_irregulares <- read_sf("dados/lotes_irregulares/SIRGAS_SHP_loteamento.shp") %>%
  st_set_crs("epsg:31983")
favela <- read_sf("dados/favela/SIRGAS_SHP_favela.shp") %>% 
  st_set_crs("epsg:31983")

censo.pontos <- censo %>%
  select(id_setor_censitario, geometry, pessoas = v0001, domicilios = v0002) %>%
  mutate(pontos = round(pessoas / 100)) %>% 
  as_tibble() %>% 
  left_join(
            # Seleção dos setores censitários que não apresentam nenhum contribuinte do IPTU
            censo %>% 
              anti_join(IPTU.censo) %>% 
              st_drop_geometry() %>% 
              select(id_setor_censitario) %>% 
              mutate(erro = TRUE)) %>% 
  mutate(erro = replace_na(erro, FALSE)) %>% 
  mutate(samples = purrr::map2(geometry, pontos, ~st_sample(.x, size = .y))) %>%
  unnest(cols = samples) %>%
  as_tibble()

gg <- censo.pontos %>% 
  ggplot() +
  geom_sf(data = distrito, color = NA) +
  geom_sf(data = st_union(favela %>% st_union() %>% st_buffer(10),
                          lotes_irregulares %>% st_union() %>% st_buffer(10)),
          aes(fill = "Favelas e lotes irregulares"), 
        color = "black", size = .1, alpha = .7) +
  geom_sf(aes(geometry = samples, color = erro), alpha = .25, size = .2) +
  scale_color_manual(values = c("FALSE" = NA,#248232
                               "TRUE" = "#D32934FF"),
                     labels = NULL) +
  scale_fill_manual("", values = c("Favelas e lotes irregulares" = "#2BAA92FF")) +
  labs(title = "<span style='font-size: 35pt;'>População em <span style = 'color:#D32934FF;'>áreas sem registro de IPTU</span> geralmente estão em <br><span style = 'color:#2BAA92FF;'>favelas ou lotes irregulares</span> (cada ponto representa 100 pessoas)</span>") + 
  theme_void() +
  theme(plot.title = element_markdown(), legend.position = "none")

# scale_colour_paletteer_d("lisa::AndyWarhol_2")

ggsave("tex/imagens/mapa_pontos.png", gg, width = 18, height = 20, dpi = 300)